package com.wang.tool.monitor.aop;

import com.wang.tool.monitor.weaver.MonitorWeaver;

import java.util.HashMap;
import java.util.Map;

/**
 * @Description 切面上使用编织器
 * @Author shaopeng
 * @Date 2022/10/23
 * @Version 1.0
 */
public interface AnnotationWeaver<R> extends MonitorWeaver<R> {

    /**
     * 初始化配置
     * 只在实例化时调用一次
     *
     * @param group       分组 非空
     * @param biz         业务码 非空
     * @param action      动作码 非空
     * @param printParam  恒输出入参
     * @param printResult 恒输出结果
     * @param config      配置 非空
     * @throws Throwable 配置有问题抛异常
     * @see Monitor#weaverConfig
     */
    void init(String group, String biz, String action, boolean printParam, boolean printResult, Map<String, String> config) throws Throwable;


    /**
     * 测试配置有效性,防止写了有问题的配置
     *
     * @param weaverType 非空
     * @param group      分组
     * @param biz        业务码
     * @param action     动作码
     * @param configs    配置
     * @return 结果
     */
    static String testConfig(Class<? extends AnnotationWeaver> weaverType, String group, String biz, String action, boolean printParam, boolean printResult, String[] configs) {
        AnnotationWeaver weaver;
        try {
            weaver = weaverType.newInstance();
            configs = configs == null ? new String[]{} : configs;
            Map<String, String> cfg = new HashMap<>();
            for (String config : configs) {
                if (config == null || config.isEmpty()) {
                    continue;
                }
                int i = config.indexOf("=");
                if (i < 0) {
                    throw new IllegalArgumentException("weaverConfig must be key=valStr");
                }
                String ck = config.substring(0, i);
                String cv = config.substring(i + 1);
                cfg.put(ck, cv);
            }
            weaver.init(group == null ? "" : group, biz == null ? "" : biz, action == null ? "" : action, printParam, printResult, cfg);
        } catch (Throwable e) {
            throw new IllegalArgumentException("initError", e);
        }
        return weaver.toString();
    }

    /**
     * 提取入参详情
     * 下游可重写
     *
     * @param params 可为空
     * @return
     */
    default Object fetchParam(Object[] params) {
        return params == null || params.length == 0 ? null : params.length == 1 ? params[0] : params;
    }

    /**
     * 提取结果详情
     * 下游可重写
     *
     * @param result 可为空
     * @return
     */
    default R fetchResult(R result) {
        return result;
    }
}
